# -*- coding: utf-8 -*-
import os
import shutil

from PyQt4.QtCore import QObject, SIGNAL, SLOT, QString, Qt
from PyQt4.QtGui import *

from config.preferences import SYSTEM, DADOS_DB

try:
    _fromUtf8 = QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s



class ActionsUiSearchDb():

    def __init__(self, uiSearchDb, db):
        """
            Construtor.
        """
        self.uiSearchDb = uiSearchDb
        self.db = db
        self.connectSlot()
        self.preencherComboBoxPesquisar()
        self.populateTree()
        self.iniciar()



    def connectSlot(self):
        """
            Metodo para a conexao e acoes dos botoes da Gui search.
        """
        QObject.connect(
                        self.uiSearchDb.pushButtonPesquisar,
                        SIGNAL("clicked()"),
                        self.pushButtonPesquisarClicked)
        QObject.connect(
                        self.uiSearchDb.comboBoxPesquisar,
                        SIGNAL("currentIndexChanged(int)"),
                        self.comboBoxPesquisarChanged)
        QObject.connect(
                        self.uiSearchDb.pushButtonVisualizar,
                        SIGNAL("clicked()"),
                        self.pushButtonVisualizarClicked)



    def preencherComboBoxPesquisar(self):
        """
            Metodo para preencher o comboBoxPesquisar com as opcoes
            de pesquisa.
        """
        self.uiSearchDb.comboBoxPesquisar.addItem(
                                                  _fromUtf8(
                                                  "Produto"))
        self.uiSearchDb.comboBoxPesquisar.addItem(
                                                  _fromUtf8(
                                                  "Número de Série"))
        self.uiSearchDb.comboBoxPesquisar.addItem(
                                                  _fromUtf8(
                                                  "Número do Pedido"))
        self.uiSearchDb.comboBoxPesquisar.addItem(
                                                  _fromUtf8(
                                                  "Ordem de Produção"))



    def iniciar(self):
        """
            Metodo para configuracao inicial da GUI Pesquisa.
            Configura a GUI Pesquisa.
        """
        self.uiSearchDb.treeWidget.setFocus()
        self.uiSearchDb.lineEdit1.setHidden(True)
        self.uiSearchDb.lineEdit2.setHidden(True)
        self.uiSearchDb.label1.setText("Produto:")
        self.uiSearchDb.label2.setHidden(True)



    def comboBoxPesquisarChanged(self):
        """
            Metodo para acao de click na comboBoxProduto.
            Configura qual lineEdit e label serao mostradas.
        """
        pesquisa = self.uiSearchDb.comboBoxPesquisar.currentText()
        self.limparTabela()
        
        if pesquisa == (_fromUtf8("Produto")):
            self.uiSearchDb.treeWidget.setHidden(False)
            self.uiSearchDb.lineEdit1.setHidden(True)
            self.uiSearchDb.lineEdit2.setHidden(True)
            self.uiSearchDb.label1.setHidden(True)
            self.uiSearchDb.label2.setHidden(True)
        
        elif pesquisa == (_fromUtf8("Número de Série")):
            self.uiSearchDb.lineEdit1.setHidden(False)
            self.uiSearchDb.lineEdit2.setHidden(False)
            self.uiSearchDb.lineEdit1.clear()
            self.uiSearchDb.lineEdit2.clear()
            self.uiSearchDb.treeWidget.setHidden(True)
            self.uiSearchDb.label1.setHidden(False)
            self.uiSearchDb.label2.setHidden(False)
            self.uiSearchDb.label1.setText(_fromUtf8("Número Inicial:"))
            self.uiSearchDb.label2.setText(_fromUtf8("Número Final:"))
        
        elif pesquisa == (_fromUtf8("Número do Pedido")):
            self.uiSearchDb.lineEdit1.setHidden(False)
            self.uiSearchDb.lineEdit2.setHidden(True)
            self.uiSearchDb.lineEdit1.clear()
            self.uiSearchDb.treeWidget.setHidden(True)
            self.uiSearchDb.label1.setHidden(False)
            self.uiSearchDb.label2.setHidden(True)
            self.uiSearchDb.label1.setText(_fromUtf8("Número do Pedido:"))
        
        elif pesquisa == (_fromUtf8("Ordem de Produção")):
            self.uiSearchDb.lineEdit1.setHidden(False)
            self.uiSearchDb.lineEdit2.setHidden(True)
            self.uiSearchDb.lineEdit1.clear()
            self.uiSearchDb.treeWidget.setHidden(True)
            self.uiSearchDb.label1.setHidden(False)
            self.uiSearchDb.label2.setHidden(True)
            self.uiSearchDb.label1.setText(_fromUtf8("Número da Ordem:"))




    def limparTabela(self):
        """
        
        """
        self.uiSearchDb.tableWidget.clear()
        self.uiSearchDb.tableWidget.setRowCount(0)
        self.uiSearchDb.tableWidget.setColumnCount(0)
        self.uiSearchDb.tableWidget.setFocus()



    def populateTree(self):
        """
            Metodo para popular treeWidget
        """
        headers = []
        faixas = self.db.getFaixas()
        faixas.sort()
        [headers.append(item) for item in faixas if not headers.count(item)]
        i = 0
        j = len(headers)
        
        while i < j:
            _text = headers[i]
            produto = self.db.popularTree(_text[0])
            text = str(_text[0])
            item = QTreeWidgetItem(self.uiSearchDb.treeWidget)
            self.uiSearchDb.treeWidget.topLevelItem(i).setText(
                0,
                QApplication.translate(
                "MainWindow",
                text,
                None,
                QApplication.
                UnicodeUTF8))
            m = 0
            n = len(produto)
            while m < n:
                item1 = QTreeWidgetItem(item)
                _text1 = produto[m]
                text1 = _text1[0]
                self.uiSearchDb.treeWidget.topLevelItem(i).child(m).setText(
                    0,
                    QApplication.translate(
                    "MainWindow",
                    text1,
                    None,
                    QApplication.UnicodeUTF8))
                m += 1
            i += 1



    def selecionaProduto(self):
        """
            Metodo que recebe o modelo do produto da comboBoxProduto
            e retorna o id do produto informado.
        """
        item = self.uiSearchDb.treeWidget.currentItem()
        produto = item.text(0)
        produto_id = self.db.getIdFromProduto(produto)
        return produto_id



    def pushButtonPesquisarClicked(self):
        """
            Metodo para realizar a acao quando o botao pesquisar for clicado.
        """
        pesquisar = self.uiSearchDb.comboBoxPesquisar.currentText()
        
        if pesquisar == (_fromUtf8("Produto")):
            self.pesquisarPorProduto()
        
        elif pesquisar == (_fromUtf8("Número de Série")):
            self.pesquisarPorSerial()
        
        elif pesquisar == (_fromUtf8("Número do Pedido")):
            self.pesquisarPorPedido()
        
        elif pesquisar == (_fromUtf8("Ordem de Produção")):
            self.pesquisarPorOrdProducao()



    def pesquisarPorProduto(self):
        """
            Metodo com todas as funcoes e procedimentos para realizar a
            pesquisa por produto.
        """
        item = self.uiSearchDb.treeWidget.currentItem()
        produto = str(item.text(0))
        _produto = produto.split(" ")
        i = len(_produto)
        i = i -1
        if _produto[i] == "MHz":
            QMessageBox.critical(None,
                                 " TSM ",
                                 _fromUtf8(
                                 "Selecione um Produto."))
        
        else:
            id_produto = self.db.getIdFromProduto(produto)
            response = self.db.getNumSeriesFromProduto(id_produto)
            produto = response[0]
            num_serie = response[1]
            ord_producao = response[2]
            numPedido = response[3]
            status = response[4]
            produto = produto[0]
            numLinhas = len(num_serie)
            
            if numLinhas == 0:
                    QMessageBox.critical(None,
                                        " TSM ",
                                        _fromUtf8(
                                        "Não há produtos."))
                
            else:
                self.uiSearchDb.tableWidget.setSortingEnabled(False)
                self.uiSearchDb.tableWidget.setRowCount(numLinhas)
                headers = [_fromUtf8("       Produto       "),
                            _fromUtf8("   Número de Série   "),
                            _fromUtf8("  Ordem de Produção   "),
                            _fromUtf8("  Status do Produto  ")]
                self.uiSearchDb.tableWidget.setColumnCount(len(headers))
                self.uiSearchDb.tableWidget.setHorizontalHeaderLabels(headers)
                j = numLinhas
                i = 0
                
                while i < j:
                    numSerie = num_serie[i]
                    numSerie = str(numSerie)
                    _ord_producao = ord_producao[i]
                    _ord_producao = str(_ord_producao)
                    num_pedido = str(numPedido[i])
                    _status = str(status[i])
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        0,
                                                        QTableWidgetItem(
                                                        produto))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        1,
                                                        QTableWidgetItem(
                                                        numSerie))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        2,
                                                        QTableWidgetItem(
                                                        _ord_producao))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        3,
                                                        QTableWidgetItem(
                                                        _status))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        4,
                                                        QTableWidgetItem(
                                                        _status))
                    i += 1
                
                self.uiSearchDb.tableWidget.setSortingEnabled(True)
                self.uiSearchDb.tableWidget.sortItems(1, 0)
                self.uiSearchDb.tableWidget.resizeColumnsToContents()
                self.uiSearchDb.tableWidget.setFocus()



    def pesquisarPorSerial(self):
        """
            Metodo com todas as acoes e funcoes utilizadas para realizar
            pesquisa por numero de serie.
        """
        numSerieInicial = str(self.uiSearchDb.lineEdit1.text())
        numSerieFinal = str(self.uiSearchDb.lineEdit2.text())
        
        if numSerieInicial == "":
                QMessageBox.warning(None,
                                    " TSM ",
                                    _fromUtf8(
                                    "Insira o número de série."))
        
        else:
            
            if numSerieFinal == "":
                vetor = self.db.pesquisarPorSerial(numSerieInicial)
                prod = self.db.getNomeProduto(vetor[0])
                _produto = prod[0]
                produto = str(_produto)
                ordProd = vetor[1]
                ordProducao = str(ordProd)
                numPed = vetor[2]
                numPedido = str(numPed)
                headers = [_fromUtf8("          Produto          "),
                            _fromUtf8("    Número do Pedido     "),
                            _fromUtf8("    Ordem de Produção     "),
                            _fromUtf8("    Status do Produto   ")]
                self.uiSearchDb.tableWidget.setColumnCount(len(headers))
                self.uiSearchDb.tableWidget.setHorizontalHeaderLabels(headers)
                self.uiSearchDb.tableWidget.setSortingEnabled(False)
                self.uiSearchDb.tableWidget.setRowCount(1)
                self.uiSearchDb.tableWidget.setItem(
                                                    0,
                                                    0,
                                                    QTableWidgetItem(
                                                    produto))
                self.uiSearchDb.tableWidget.setItem(
                                                    0,
                                                    1,
                                                    QTableWidgetItem(
                                                    numSerieInicial))
                self.uiSearchDb.tableWidget.setItem(
                                                    0,
                                                    2,
                                                    QTableWidgetItem(
                                                    numPedido))
                self.uiSearchDb.tableWidget.setItem(
                                                    0,
                                                    3,
                                                    QTableWidgetItem(
                                                    ordProducao))
                self.uiSearchDb.tableWidget.setItem(
                                                    0,
                                                    4,
                                                    QTableWidgetItem(
                                                    status))
                self.uiSearchDb.tableWidget.setSortingEnabled(True)
                self.uiSearchDb.tableWidget.resizeColumnsToContents()
                self.uiSearchDb.tableWidget.setFocus()
            else:
                pass



    def pesquisarPorPedido(self):
        """
           Recebe o numero do pedido da lineEdtit na variavel numPedido,
           executa o metodo db.pesquisarPorPedido e recebe um vetor com 
           as variaveis (id_produto, num_serie, num_pedido).
        """
        numPedido = self.uiSearchDb.lineEdit1.text()
        self.num_pedido = numPedido
        
        if  numPedido == "":
            QMessageBox.critical(
                                None,
                                " TSM ",
                                _fromUtf8(
                                "Insira o número do pedido."))
        
        else:
            num_pedido = str(numPedido)
            response = self.db.pesquisarPorPedido(num_pedido)
            numLinhas = len(response)
            
            if numLinhas == 0:
                QMessageBox.critical(
                                    None,
                                    " TSM ",
                                    _fromUtf8(
                                    "Não há produtos com esse número."))
            
            else:
                i = 0
                self.uiSearchDb.tableWidget.setSortingEnabled(False)
                self.uiSearchDb.tableWidget.setRowCount(numLinhas)
                headers = [_fromUtf8("          Produto          "),
                            _fromUtf8("    Número de Série      "),
                            _fromUtf8("    Ordem de Produção     "),
                            _fromUtf8("    Status do Produto   ")]
                self.uiSearchDb.tableWidget.setColumnCount(len(headers))
                self.uiSearchDb.tableWidget.setHorizontalHeaderLabels(headers)
                
                for vet in response:
                    idProduto = vet[0]
                    produto = self.db.getNomeProduto(str(idProduto))
                    produto = str(produto[0])
                    numSerie = str(vet[1])
                    ordProd = str(vet[2])
                    status = str(vet[3])
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        0,
                                                        QTableWidgetItem(
                                                        produto))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        1,
                                                        QTableWidgetItem(
                                                        numSerie))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        2,
                                                        QTableWidgetItem(
                                                        ordProd))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        3,
                                                        QTableWidgetItem(
                                                        status))
                    i += 1
                
                self.uiSearchDb.tableWidget.setSortingEnabled(True)
                self.uiSearchDb.tableWidget.sortItems(1, 0)
                self.uiSearchDb.tableWidget.resizeColumnsToContents()
                self.uiSearchDb.tableWidget.setFocus()



    def pesquisarPorOrdProducao(self):
        """
            Metodo com todas as funcoes para realizar pesquisa por numero da
            ordem de producao.
        """
        ordProd = self.uiSearchDb.lineEdit1.text()
        
        if  ordProd == "":
            QMessageBox.critical(None,
                                " TSM ",
                                _fromUtf8(
                                "Insira o número da ordem de produção."))
        
        else:
            ordProd = str(ordProd)
            response = self.db.pesquisarPorOrdProducao(ordProd)
            numLinhas = len(response)
            
            if numLinhas == 0:
                QMessageBox.critical(None,
                                    " TSM ",
                                     _fromUtf8(
                                     "Não há produtos."))
            
            else:
                i = 0
                self.uiSearchDb.tableWidget.setSortingEnabled(False)
                self.uiSearchDb.tableWidget.setRowCount(numLinhas)
                headers = [_fromUtf8("          Produto          "),
                            _fromUtf8("    Número de Série      "),
                            _fromUtf8("    Número do Pedido     "),
                            _fromUtf8("    Status do Produto   ")]
                self.uiSearchDb.tableWidget.setColumnCount(len(headers))
                self.uiSearchDb.tableWidget.setHorizontalHeaderLabels(headers)
                
                for vet in response:
                    idProduto = vet[0]
                    produto = self.db.getNomeProduto(str(idProduto))
                    produto = str(produto[0])
                    numSerie = str(vet[1])
                    numPedido = str(vet[2])
                    status = str(vet[3])
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        0,
                                                        QTableWidgetItem(
                                                        produto))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        1,
                                                        QTableWidgetItem(
                                                        numSerie))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        2,
                                                        QTableWidgetItem(
                                                        numPedido))
                    self.uiSearchDb.tableWidget.setItem(
                                                        i,
                                                        3,
                                                        QTableWidgetItem(
                                                        status))
                    i += 1
                
                self.uiSearchDb.tableWidget.setSortingEnabled(True)
                self.uiSearchDb.tableWidget.sortItems(1, 0)
                self.uiSearchDb.tableWidget.resizeColumnsToContents()
                self.uiSearchDb.tableWidget.setFocus()



    def pushButtonVisualizarClicked(self):
        """
    
        """
        if SYSTEM == "linux2":
            allRows = self.uiSearchDb.tableWidget.rowCount()
            for row in xrange(0,allRows):
                _num_serie = self.uiSearchDb.tableWidget.item(row, 1)
                num_serie = str(_num_serie.text())
                response = self.db.getPlotPathSerial(num_serie)
                shutil.copy(response[0], DADOS_DB + "print/")
                
            os.chdir(DADOS_DB + "print/")
            path = os.getcwd()
            cmd = ("dolphin" + " " + "%s") % (path)
            os.system(cmd)
            self.pushButtonFecharClicked()
            
        else:
            response = self.db.getPlotPath(self.num_pedido)
            for plot in response:
                shutil.copy(
                            plot[0],
                            "//192.168.1.250/vna/dados/print")
            
            os.chdir("//192.168.1.250/vna/dados/print")
            QFileDialog.getOpenFileName()



    def pushButtonFecharClicked(self):
        """
        
        """
        if SYSTEM == "linux2":
            os.chdir(DADOS_DB + "print/")
            arquivos = os.listdir(DADOS_DB + "print/")
            if len(arquivos) == 0:
                pass
            else:
                for arq in arquivos:
                    os.remove(arq)
        else:
            os.chdir("//192.168.1.250/vna/dados/print")
            arquivos = os.listdir("//192.168.1.250/vna/dados/print")
            if len(arquivos) == 0:
                pass
            else:
                for arq in arquivos:
                    os.remove(arq)
